/**
 * Software License, Version 1.0
 * 
 * Copyright 2003 The Trustees of Indiana University.  All rights reserved.
 * 
 *
 *Redistribution and use in source and binary forms, with or without 
 *modification, are permitted provided that the following conditions are met:
 *
 *1) All redistributions of source code must retain the above copyright notice,
 * the list of authors in the original source code, this list of conditions and
 * the disclaimer listed in this license;
 *2) All redistributions in binary form must reproduce the above copyright 
 * notice, this list of conditions and the disclaimer listed in this license in
 * the documentation and/or other materials provided with the distribution;
 *3) Any documentation included with all redistributions must include the 
 * following acknowledgement:
 *
 *"This product includes software developed by the Community Grids Lab. For 
 * further information contact the Community Grids Lab at 
 * http://communitygrids.iu.edu/."
 *
 * Alternatively, this acknowledgement may appear in the software itself, and 
 * wherever such third-party acknowledgments normally appear.
 * 
 *4) The name Indiana University or Community Grids Lab or NaradaBrokering, 
 * shall not be used to endorse or promote products derived from this software 
 * without prior written permission from Indiana University.  For written 
 * permission, please contact the Advanced Research and Technology Institute 
 * ("ARTI") at 351 West 10th Street, Indianapolis, Indiana 46202.
 *5) Products derived from this software may not be called NaradaBrokering, 
 * nor may Indiana University or Community Grids Lab or NaradaBrokering appear
 * in their name, without prior written permission of ARTI.
 * 
 *
 * Indiana University provides no reassurances that the source code provided 
 * does not infringe the patent or any other intellectual property rights of 
 * any other entity.  Indiana University disclaims any liability to any 
 * recipient for claims brought by any other entity based on infringement of 
 * intellectual property rights or otherwise.  
 *
 *LICENSEE UNDERSTANDS THAT SOFTWARE IS PROVIDED "AS IS" FOR WHICH NO 
 *WARRANTIES AS TO CAPABILITIES OR ACCURACY ARE MADE. INDIANA UNIVERSITY GIVES
 *NO WARRANTIES AND MAKES NO REPRESENTATION THAT SOFTWARE IS FREE OF 
 *INFRINGEMENT OF THIRD PARTY PATENT, COPYRIGHT, OR OTHER PROPRIETARY RIGHTS. 
 *INDIANA UNIVERSITY MAKES NO WARRANTIES THAT SOFTWARE IS FREE FROM "BUGS", 
 *"VIRUSES", "TROJAN HORSES", "TRAP DOORS", "WORMS", OR OTHER HARMFUL CODE.  
 *LICENSEE ASSUMES THE ENTIRE RISK AS TO THE PERFORMANCE OF SOFTWARE AND/OR 
 *ASSOCIATED MATERIALS, AND TO THE PERFORMANCE AND VALIDITY OF INFORMATION 
 *GENERATED USING SOFTWARE.
 */
package cgl.narada.node;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;

public class BrokerProperties {

	private static final BrokerProperties instance = new BrokerProperties();

	private Properties defaultProperties;

	private Properties properties;

	private String configFileLocation = null;

	private boolean initialized = false;

	private String moduleName = "BrokerProperties: ";

	private BrokerProperties() {
		properties = new Properties(defaultProperties);
	}
	
	
	public static BrokerProperties getInstance() {
		return instance;
	}

	public synchronized boolean initialize(String configFileLocation) {
		if (configFileLocation == null) {
			System.out.println(moduleName + "The specified file location is null");
			return false;
		}

		if (initialized) {
			System.out.println(moduleName + "Has been previously initialized with"
					+ " file [" + this.configFileLocation + "]");
			return false;
		}
		
		boolean loadingSuccessful = loadProperties(configFileLocation);
		if (loadingSuccessful) {	
			this.configFileLocation = configFileLocation;
			initialized = true;
		} else {
			System.out.println(moduleName + "There were problems initializing" 
					+ " with specified file [" + configFileLocation + "]." +
					" Please check specified .properties file!");
			return false;
		}
			
		return true;
	}

	
	
	
	
	/** Try to load the properties from the configuration file location. */
	private boolean loadProperties(String configFileLocation) {
		try {
			properties.load(new FileInputStream(configFileLocation));
		} catch (IOException ex) {
			ex.printStackTrace();
			return false;
		}
		return true;
	}
	
	
	/** Check to see if a certain property exists.*/
	public boolean hasProperty(String propertyName) {
		if (properties.containsKey(propertyName)) {
			return true;
		}
		return false;
	}
	
	/** Retrieve a certain property. This will return a NULL if the property is
	 * not found. */
	public String getProperty(String propertyName) {
		return properties.getProperty(propertyName);
	}
	
	

	/** This method loads default properties. These will be over-ridden by any
	 * properties that may be specified in the initialization of this class. */
	private void loadDefaultProperties() {
		defaultProperties = new Properties();
		defaultProperties.setProperty("NIOTCPBrokerPort", "3045");
		defaultProperties.setProperty("TCPBrokerPort", "5045");
		defaultProperties.setProperty("UDPBrokerPort", "3045");
		defaultProperties.setProperty("PTCPBrokerPort", "15045");
		defaultProperties.setProperty("PTCPStreamNumber", "5");
		defaultProperties.setProperty("MulticastGroupHost", "224.224.224.224");
		defaultProperties.setProperty("MulticastGroupPort", "0");
		defaultProperties.setProperty("PoolTCPBrokerPort", "0");
		defaultProperties.setProperty("HTTPSBrokerPort","0");
		defaultProperties.setProperty("SSLBrokerPort","0");
		defaultProperties.setProperty("HTTPBrokerPort", "0");
		defaultProperties.setProperty("SupportRTP", "no");
		defaultProperties.setProperty("ConcurrentConnectionLimit", "3000");
		defaultProperties.setProperty("Discriminator", "156.56.*");
		defaultProperties.setProperty("AssignedAddress", "true");
		defaultProperties.setProperty("AboutThisBroker","CGL, Indiana University, " +
				"Bloomington, IN, U.S.A.");
		defaultProperties.setProperty("BDNList", "");
		defaultProperties.setProperty("BDNDiscoList", "http://www.idonotexist.com," +
				"http://trex.ucs.indiana.edu:8080/BDN/servlet/Discover," +
				"http://www.gridserlocator.org/");
		defaultProperties.setProperty("DiscoveryResponsePolicy", 
				"cgl.narada.discovery.broker.DefaultBrokerDiscoveryRequestResponsePolicy");
		defaultProperties.setProperty("VirtualBrokerNetwork" , "network-CGL-1");
		defaultProperties.setProperty("MAXBrokerDiscoRequests", "1000");
		defaultProperties.setProperty("KEYStore", "c:\\Home\\tmpFiles\\KEYSTORES");
	}
	
}
